package com.puboot.common.util;

import java.math.BigDecimal;
import java.util.List;

/**
 * 化工
 * Created by chen on 2022/01/05.
 */
public class ChemicalIndustryUtil {

    /**
     * 温室气体排放总量，单位为t
     * @param eBurn 核算单元i的燃料燃烧产生的二氧化碳排放量，单位为t
     * @param eProcess 核算单元i的工业生产过程产生的各种温室气体排放总量，单位为t
     * @param rco2 核算单元i的回收且外供的二氧化碳量，单位为t
     * @param ePurchaseElectric 核算单元i的购入电力产生的二氧化碳排放量，单位为t
     * @param ePurchaseHeat 核算单元i的购入热力产生的二氧化碳排放量，单位为t
     * @param eOutputElectric 核算单元i的输出电力产生的二氧化碳排放量，单位为t
     * @param eOutputHeat 核算单元i的输出热力产生的二氧化碳排放量，单位为t
     * @return
     */
    public static Double getE(Double eBurn, Double eProcess, Double rco2, Double ePurchaseElectric,
                              Double ePurchaseHeat, Double eOutputElectric,
                              Double eOutputHeat) {
        BigDecimal rco2B = new BigDecimal(rco2);
        BigDecimal ePurchaseElectricB = new BigDecimal(ePurchaseElectric);
        BigDecimal ePurchaseHeatB = new BigDecimal(ePurchaseHeat);
        BigDecimal eOutputElectricB = new BigDecimal(eOutputElectric);
        BigDecimal eOutputHeatB = new BigDecimal(eOutputHeat);
        BigDecimal jsgc1 = GasDCUtil.allAdd(eBurn, eProcess);
        BigDecimal jsgc2 = jsgc1.subtract(rco2B);
        BigDecimal jsgc3 = jsgc2.add(ePurchaseElectricB).add(ePurchaseHeatB);
        BigDecimal jsgc4 = jsgc3.subtract(eOutputElectricB).subtract(eOutputHeatB);
        return jsgc4.doubleValue();
    }

    /**
     * 核算单元i的工业生产过程产生的各种温室气体排放总量，单位为t
     * @param adirs 第i个核算单元的原料r的投入量，对固体和液体燃料以t为单位，对气体燃料以104Nm3为单位
     * @param ccirs 第i个核算单元的原料r的含碳量，对固体和液体燃料以tC/t为单位，对气体燃料以tC/104Nm3为单位
     * @param adips 第i个核算单元的产品p的产量，对固体和液体燃料以t为单位，对气体燃料以104Nm3为单位
     * @param ccips 第i个核算单元的产品p的含碳量，对固体和液体燃料以tC/t为单位，对气体燃料以tC/104Nm3为单位
     * @param adiws 第i个核算单元的其他含碳输出物w的产量，单位为t
     * @param cciws 第i个核算单元的其他含碳输出物w的含碳量，单位为tC/t
     * @param carbonateAdijs 第i个核算单元的碳酸盐j用于原料、助溶剂、脱硫剂等的总消耗量，单位为t
     * @param carbonateEfijs 第i个核算单元的碳酸盐j的二氧化碳排放因子，单位为tCO2/t
     * @param carbonatePurijs 第i个核算单元的碳酸盐j以质量分数表示的纯度，单位为%
     * @param nitricAcidAdijs 第i个核算单元的生产技术类型j的硝酸产量，单位为t
     * @param nitricAcidNitrousOxideEfijs 第i个核算单元的生产技术类型j的氧化亚氮生成因子，单位为kgN2O/tHNO3
     * @param nitricAcidNitrousOxideRemoves 第i个核算单元的尾气处理设备k的氧化亚氮去除效率，单位为%
     * @param nitricAcidNitrousOxideRatios 第i个核算单元的尾气处理设备k的使用率，等于尾气处理设备运行时间与硝酸生产装置运行时间的比率，单位为%
     * @param adipicAcidAdijs 第i个核算单元的生产技术类型j的己二酸产量，单位为t
     * @param adipicAcidEfijs 第i个核算单元的生产技术类型j的氧化亚氮生成因子，单位为kgN2O/tC6H10O4
     * @param adipicAcidNitrousOxideRemoves 第i个核算单元的尾气处理设备k的氧化亚氮去除效率，单位为%
     * @param adipicAcidNitrousOxideRatios 第i个核算单元的尾气处理设备k的使用率，等于尾气处理设备运行时间与己二酸生产装置运行时间的比率，单位为%
     * @return
     */
    public static Double getEProcess(List<String> adirs, List<String> ccirs,
                                     List<String> adips, List<String> ccips,
                                     List<String> adiws, List<String> cciws,
                                     List<String> carbonateAdijs, List<String> carbonateEfijs, List<String> carbonatePurijs,
                                     List<String> nitricAcidAdijs, List<String> nitricAcidNitrousOxideEfijs, List<String> nitricAcidNitrousOxideRemoves, List<String> nitricAcidNitrousOxideRatios,
                                     List<String> adipicAcidAdijs, List<String> adipicAcidEfijs, List<String> adipicAcidNitrousOxideRemoves, List<String> adipicAcidNitrousOxideRatios){
        BigDecimal cl1B = new BigDecimal(44);
        BigDecimal cl2B = new BigDecimal(12);
        BigDecimal cl4B = new BigDecimal(1);
        BigDecimal result1 = new BigDecimal(0.0);
        for (int i = 0; i < adirs.size(); i++) {
            BigDecimal jsgc = GasDCUtil.allMul(Double.valueOf(adirs.get(i)), Double.valueOf(ccirs.get(i)));
            result1 = result1.add(jsgc);
        }
        BigDecimal result2 = new BigDecimal(0.0);
        for (int i = 0; i < adips.size(); i++) {
            BigDecimal jsgc = GasDCUtil.allMul(Double.valueOf(adips.get(i)), Double.valueOf(ccips.get(i)));
            result2 = result2.add(jsgc);
        }
        BigDecimal result3 = new BigDecimal(0.0);
        for (int i = 0; i < adiws.size(); i++) {
            BigDecimal jsgc = GasDCUtil.allMul(Double.valueOf(adiws.get(i)), Double.valueOf(cciws.get(i)));
            result3 = result3.add(jsgc);
        }
        BigDecimal jsgc1 = result1.subtract(result2).subtract(result3);
        BigDecimal jsgc2 = jsgc1.multiply(cl1B).divide(cl2B, 10, BigDecimal.ROUND_HALF_UP);
        BigDecimal result4 = new BigDecimal(0.0);
        for (int i = 0; i < carbonateAdijs.size(); i++) {
            BigDecimal jsgc = GasDCUtil.allMul(Double.valueOf(carbonateAdijs.get(i)), Double.valueOf(carbonateEfijs.get(i)), Double.valueOf(carbonatePurijs.get(i)));
            result4 = result4.add(jsgc);
        }
        BigDecimal jsgc3 = jsgc2.add(result4);
        BigDecimal result5 = new BigDecimal(0.0);
        for (int i = 0; i < nitricAcidAdijs.size(); i++) {
            BigDecimal nitricAcidJsgc1 = GasDCUtil.allMul(Double.valueOf(nitricAcidNitrousOxideRemoves.get(i)), Double.valueOf(nitricAcidNitrousOxideRatios.get(i)));
            BigDecimal nitricAcidJsgc2 = cl4B.subtract(nitricAcidJsgc1);
            BigDecimal jsgc = GasDCUtil.allMul(Double.valueOf(nitricAcidAdijs.get(i)), Double.valueOf(nitricAcidNitrousOxideEfijs.get(i)), nitricAcidJsgc2.doubleValue());
            result5 = result5.add(jsgc);
        }


        BigDecimal result6 = new BigDecimal(0.0);
        for (int i = 0; i < adipicAcidAdijs.size(); i++) {
            BigDecimal adipicAcidJsgc1 = GasDCUtil.allMul(Double.valueOf(adipicAcidNitrousOxideRemoves.get(i)), Double.valueOf(adipicAcidNitrousOxideRatios.get(i)));
            BigDecimal adipicAcidJsgc2 = cl4B.subtract(adipicAcidJsgc1);
            BigDecimal jsgc = GasDCUtil.allMul(Double.valueOf(adipicAcidAdijs.get(i)), Double.valueOf(adipicAcidEfijs.get(i)), adipicAcidJsgc2.doubleValue());
            result6 = result6.add(jsgc);
        }
        BigDecimal jsgc5 = result5.add(result6);
        result5 =GasDCUtil.allMul(jsgc5.doubleValue(), 0.31);
        BigDecimal jsgc4 = jsgc3.add(result5);
        return jsgc4.doubleValue();
    }

}
